package com.systop.asset.mapper;

import com.systop.asset.entity.Asset;
import com.systop.asset.entity.vo.AssetVo;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Select;

import java.util.List;
import java.util.Map;

/**
 * <p>ClassName : AssetMapper</p>
 * <p>Description : </p>
 *
 * @author 孙伟光
 * @version 1.0
 * @date 2025/6/26 8:51
 */
public interface AssetMapper {


    /**
     * 根据ID查询资产信息
     * @param id 资产ID
     * @return 资产对象
     */
    AssetVo selectAssetVoById(Long id);

    /**
     * 根据ID查询资产信息
     * @param id 资产ID
     * @return 资产对象
     */
    Asset selectAssetById(Long id);
     /**
     * 查询资产列表
     * @param asset 资产查询条件对象，包含筛选条件
     * @return 符合条件的资产列表
     */
    List<Asset> selectAssetList(Asset asset);

    /**
     * 连表查询资产列表
     * @param asset 资产查询条件对象，包含筛选条件
     * @return 符合条件的资产列表
     */
    List<AssetVo> selectAssetJoinList(Asset asset);

    /**
     * 新增资产
     * @param asset 要新增的资产对象
     * @return 受影响的行数
     */
    int insertAsset(Asset asset);

        /**
     * 批量新增资产
     * @param assets 要批量新增的资产对象列表
     * @return 受影响的行数
     */
    int insertAssetBatch(List<Asset> assets);

    /**
     * 更新资产信息
     * @param asset 要更新的资产对象，需包含资产ID
     * @return 受影响的行数
     */
    int updateAsset(Asset asset);

    /**
     * 删除资产
     * @param id 要删除的资产ID
     * @return 受影响的行数
     */
    int deleteAsset(Long id);

    /**
     * 按状态分组统计资产数量和占比
     * @return 包含状态、数量和占比的列表
     */
    @MapKey("status")
    List<Map<String, Object>> countByStatusGroup();

    /**
     * 按分类和状态分组统计资产数量
     * @return 包含分类名称、总数和各状态数量的列表
     */
    @MapKey("categoryName")
    List<Map<String, Object>> countByCategoryAndStatusGroup();

    /**
     * 按部门和状态分组统计资产数量
     * @return 包含部门名称、总数和各状态数量的列表
     */
    @MapKey("deptName")
    List<Map<String, Object>> countByDeptAndStatusGroup();

    /**
     * 按位置分组统计资产数量
     * @return 包含位置名称和资产数量的列表
     */
    @MapKey("locationName")
    List<Map<String, Object>> countByLocationGroup();

    /**
     * 获取所有资产总数
     * @return 资产总数
     */
    @Select("SELECT COUNT(*) FROM assets WHERE is_deleted = 0")
    Long selectTotalAssetCount();
}
